// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()

/////////////////////////////////////////
// 10位时间戳转 2021-04-20 18:30:22
function formatDateTime(time) {
  let date = new Date(time * 1000)
  return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + ' ' + (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':' + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes())
}
// 字符转时间戳(10位):输入：2021-05-03 12:33:33
function stringToTime(timeString) {
  // var date = getDate(timeString)
  var date = timeString.replace(/-/g, '/');
  var timestamp = new Date(date).getTime() / 1000;
  return timestamp;
}
// 获取10位时间戳
function nowTimeStamp() {
  var timestamp = Date.parse(new Date());
  timestamp = timestamp / 1000;
  return timestamp;
}
// 今天格式化： 2021-01-01
function formatToday() {
  let date = new Date()
  let mm = date.getMonth() + 1,dd = date.getDate();
  let today = date.getFullYear() + '-' + (mm < 10 ? '0' + mm : mm) + '-' + (dd < 10 ? '0' + dd : dd)
  return today
}

/*获取当前年的第几周，以及周对应的日期范围（根据当前日期的时间）
*@author weiyongfu
*@date 2017-11-17
*/
function getYearWeekRange(year, weekNum) {
  var date = null;
  var year = year;
  var month = null;
  var day = null;
  var d = null;
  if (weekNum == null || weekNum == "") {//如果为空，默认加载当前日期，否则加载选择的周数
    date = new Date();//获取系统时间
    year = date.getFullYear();//年
    month = date.getMonth() + 1;//月
    day = date.getDate();//
    var d = year + "-" + month + "-" + day;
  } else {
    if (weekNum.length == 3) {
      weekNum = weekNum.substring(1, 2);
    } else if (weekNum.length == 4) {
      weekNum = weekNum.substring(1, 3);
    }
    var weekDay = getDayEveryDay(year, weekNum);
    d = weekDay[0];//获取对应周数的第一天
  }
  //获取当前日期的为今年的第几周的周数，常规的获取直接调用getWeekNumber(year, month, day);
  /*由于项目需要，我这儿的周定义为周五到下周四为一周,所以我传入的日期参数得往前推4天，
  *然后在调用常规的计算周数的方法
  */
  var beforeFourDay = GetDateStr(-4, d);//当前日期前推4天的日期,返回值格式为2017-01-01;/
  var yearMonthDay = beforeFourDay.split("-");

  if (weekNum == null || weekNum == "") {//如果为空，默认加载当前日期的周数以及对应范围,否未为选择的周数
    weekNum = getWeekNumber(yearMonthDay[0], yearMonthDay[1], yearMonthDay[2]);//按照周五到下周四为一周，计算当前日期为今年的第几周
  } else {
    weekNum = weekNum;
  }
  //获取当前日期的为今年的第几周的周数日期范围，getDateRange("2017-01-01")，在调用常规的计算周数日期的方法返回值为["2016-12-26","2017-1-1"];
  /*由于项目需要，我这儿的周定义为周五到下周四为一周,
  *在调用常规的计算周数日期的方法返回值时得相应做出调整getDateRange("2017-01-01");return ["2016-12-26","2017-1-1"];
  * arr[0]前推3天，arr[1]后推5天,["2016-12-30","2017-1-5"],得出2017年的1月1馹,(按照周五到下周四算一周为一周的日期范围为["2016-12-30","2017-1-5"])
  */
  var weekRange = getDateRange(beforeFourDay);//常规的传入时间返回周的范围(周一到周天) return 格式["2016-12-26","2017-1-1"]
  weekRange[0] = GetDateStr(4, weekRange[0]);//后推4天
  weekRange[1] = GetDateStr(4, weekRange[1]);//后推4天
  //返回当前日期为[年，周数，周的范围start,周的范围end],按照周五到下周四为一周
  return [year, weekNum, weekRange[0], weekRange[1]];
}

function getYearWeekRange2(year, weekNum) {
  var date = null;
  var year = year;
  var month = null;
  var day = null;
  var d = null;
  if (weekNum == null || weekNum == "") {//如果为空，默认加载当前日期，否则加载选择的周数
    date = new Date();//获取系统时间
    year = date.getFullYear();//年
    month = date.getMonth() + 1;//月
    day = date.getDate();//
    var d = year + "-" + month + "-" + day;
  } else {
    if (weekNum.length == 3) {
      weekNum = weekNum.substring(1, 2);
    } else if (weekNum.length == 4) {
      weekNum = weekNum.substring(1, 3);
    }
    var weekDay = getDayEveryDay(year, weekNum);
    d = weekDay[0];//获取对应周数的第一天
  }
  //获取当前日期的为今年的第几周的周数，常规的获取直接调用getWeekNumber(year, month, day);
  /*由于项目需要，我这儿的周定义为周五到下周四为一周,所以我传入的日期参数得往前推4天，
  *然后在调用常规的计算周数的方法
  */
  var beforeFourDay = GetDateStr(0, d);//当前日期前推4天的日期,返回值格式为2017-01-01;/
  var yearMonthDay = beforeFourDay.split("-");

  if (weekNum == null || weekNum == "") {//如果为空，默认加载当前日期的周数以及对应范围,否未为选择的周数
    weekNum = getWeekNumber(yearMonthDay[0], yearMonthDay[1], yearMonthDay[2]);//按照周五到下周四为一周，计算当前日期为今年的第几周
  } else {
    weekNum = weekNum;
  }
  //获取当前日期的为今年的第几周的周数日期范围，getDateRange("2017-01-01")，在调用常规的计算周数日期的方法返回值为["2016-12-26","2017-1-1"];
  /*由于项目需要，我这儿的周定义为周五到下周四为一周,
  *在调用常规的计算周数日期的方法返回值时得相应做出调整getDateRange("2017-01-01");return ["2016-12-26","2017-1-1"];
  * arr[0]前推3天，arr[1]后推5天,["2016-12-30","2017-1-5"],得出2017年的1月1馹,(按照周五到下周四算一周为一周的日期范围为["2016-12-30","2017-1-5"])
  */
  var weekRange = getDateRange(beforeFourDay);//常规的传入时间返回周的范围(周一到周天) return 格式["2016-12-26","2017-1-1"]

  //返回当前日期为[年，周数，周的范围start,周的范围end],按照周五到下周四为一周
  return [year, weekNum, weekRange[0], weekRange[1]];
}

/**
 * mygia-计算自然周
 * @param {} datevalue 
 */
function getWeekMonth(datevalue) {
  var dateValue = datevalue;
  var date = null;
  var year = null;
  var month = null;
  var day = null;
  if (datevalue == null || datevalue == "") {
    date = new Date();//获取系统时间
    year = date.getFullYear();//年
    month = date.getMonth() + 1;//月
    day = date.getDate();//日
    dateValue = year + "-" + month + "-" + day;
  }else{
    var date1 = datevalue.replace(/-/g, '/');
    date = new Date(date1)
    year = date.getFullYear();//年
    month = date.getMonth() + 1;//月
    day = date.getDate();//日
    // dateValue = year + "-" + month + "-" + day;
  }

  var arr = dateValue.split("-")
  //月份-1 因为月份从0开始 构造一个Date对象
  var date = new Date(arr[0], arr[1] - 1, arr[2]);
  var dateOfWeek = date.getDay();//返回当前日期的在当前周的某一天（0～6--周日到周一）
  var dateOfWeekInt = parseInt(dateOfWeek, 10);//转换为整型
  if (dateOfWeekInt == 0) {//如果是周日
    dateOfWeekInt = 7;
  }
  var aa = 7 - dateOfWeekInt;//当前于周末相差的天数
  var temp2 = parseInt(arr[2], 10);//按10进制转换，以免遇到08和09的时候转换成0
  var sunDay = temp2 + aa;//当前日期的周日的日期
  var monDay = sunDay - 6//当前日期的周一的日期
  var startDate = new Date(arr[0], arr[1] - 1, monDay);
  var endDate = new Date(arr[0], arr[1] - 1, sunDay);
  var sm = parseInt(startDate.getMonth()) + 1;//月份+1 因为月份从0开始
  var em = parseInt(endDate.getMonth()) + 1;

  var start = startDate.getFullYear() + "-" + sm + "-" + startDate.getDate();//周一
  var end = endDate.getFullYear() + "-" + em + "-" + endDate.getDate();//周日
  var weekNum = getWeekNumber(startDate.getFullYear(), sm, startDate.getDate());
  var mstart = year + "-" + month + "-" + "1";
  var mend = year + "-" + month + "-" + getMonthDays(year,month-1);
  var data = {
    today: dateValue,
    week: parseInt(startDate.getFullYear() + "0" + (weekNum < 10 ? '0' + weekNum : weekNum)),
    month: parseInt(year + (month < 10 ? '0' + month : month)),
    weekBegin: stringToTime(start+' 00:00:00'),
    weekEnd: stringToTime(end+' 23:59:59'),
    monthBegin: stringToTime(mstart+' 00:00:00'),
    monthEnd: stringToTime(mend+' 23:59:59')
  }
  return data;
}

/*
*传入年，周数，获取周数对应的所有日期
 */
function getDayEveryDay(year, index) {
  var d = new Date(year, 0, 1);
  while (d.getDay() != 1) {
      d.setDate(d.getDate() + 1);
  }
  var to = new Date(year + 1, 0, 1);
  var i = 1;
  var arr = [];
  for (var from = d; from < to;) {
      if (i == index) {
          arr.push(from.getFullYear() + "-" + (from.getMonth() + 1) + "-" + from.getDate());
      }
      var j = 6;
      while (j > 0) {
          from.setDate(from.getDate() + 1);
          if (i == index) {
              arr.push(from.getFullYear() + "-" + (from.getMonth() + 1) + "-" + from.getDate());
          }
          j--;
      }
      if (i == index) {
          return arr;
      }
      from.setDate(from.getDate() + 1);
      i++;
  }
}

/*
*这个方法是获取周对应的日期范围(常规的一周为周一到周天为一周
* 参数datevalue如：2017-01-01)
*/
function getDateRange(datevalue) {
  var dateValue = datevalue;
  var arr = dateValue.split("-")
  //月份-1 因为月份从0开始 构造一个Date对象
  var date = new Date(arr[0], arr[1] - 1, arr[2]);
  var dateOfWeek = date.getDay();//返回当前日期的在当前周的某一天（0～6--周日到周一）
  var dateOfWeekInt = parseInt(dateOfWeek, 10);//转换为整型
  if (dateOfWeekInt == 0) {//如果是周日
    dateOfWeekInt = 7;
  }
  var aa = 7 - dateOfWeekInt;//当前于周末相差的天数
  var temp2 = parseInt(arr[2], 10);//按10进制转换，以免遇到08和09的时候转换成0
  var sunDay = temp2 + aa;//当前日期的周日的日期
  var monDay = sunDay - 6//当前日期的周一的日期
  var startDate = new Date(arr[0], arr[1] - 1, monDay);
  var endDate = new Date(arr[0], arr[1] - 1, sunDay);
  var sm = parseInt(startDate.getMonth()) + 1;//月份+1 因为月份从0开始
  var em = parseInt(endDate.getMonth()) + 1;
  //  alert("星期一的日期："+startDate.getFullYear()+"-"+sm+"-"+startDate.getDate());
  //  alert("星期日的日期："+endDate.getFullYear()+"-"+em+"-"+endDate.getDate());
  var start = startDate.getFullYear() + "-" + sm + "-" + startDate.getDate();
  var end = endDate.getFullYear() + "-" + em + "-" + endDate.getDate();
  var result = new Array();
  result.push(start);
  result.push(end);
  return result;
}

//以下几个函数是判断当前日期所对应的周数，如2017-1-1，为2017年第一周,return 1
/**
2  * 判断年份是否为润年
3  *
4  * @param {Number} year
5  */
function isLeapYear(year) {
  return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}

/**
10  * 获取某一年份的某一月份的天数
11  *
12  * @param {Number} year
13  * @param {Number} month
14  */
function getMonthDays(year, month) {
  return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] || (isLeapYear(year) ? 29 : 28);
}

/**
27  * 获取某年的某天是第几周
28  * @param {Number} y
29  * @param {Number} m
30  * @param {Number} d
31  * @returns {Number}
32  */
function getWeekNumber(y, m, d) {
  var now = new Date(y, m - 1, d),
    year = now.getFullYear(),
    month = now.getMonth(),
    days = now.getDate();
  //那一天是那一年中的第多少天
  for (var i = 0; i < month; i++) {
    days += getMonthDays(year, i);
  }
  //那一年第一天是星期几
  var yearFirstDay = new Date(year, 0, 1).getDay() || 7;
  var week = null;
  if (yearFirstDay == 1) {
    week = Math.ceil(days / yearFirstDay);
  } else {
    days -= (7 - yearFirstDay + 1);
    week = Math.ceil(days / 7) + 1;
  }
  return week;
}//计算周的范围结束

/*
*js获取当前指定的前几天的日期,往前推4天，GetDateStr(4)，后推4天GetDateStr(-4)
*/
function GetDateStr(AddDayCount, date) {
  var dd = new Date(date);
  dd.setDate(dd.getDate() + AddDayCount);//获取AddDayCount天后的日期
  var y = dd.getFullYear();
  var m = (dd.getMonth() + 1) < 10 ? "0" + (dd.getMonth() + 1) : (dd.getMonth() + 1);//获取当前月份的日期，不足10补0
  var d = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate();//获取当前几号，不足10补0
  return y + "-" + m + "-" + d;
}

// 云函数入口函数
exports.main = async (event, context) => {
  console.log(event)
  var data = getWeekMonth(event.thedate)
  // {
  //   today: today,
  //   week: week,
  //   month: month,
  //   weekBegin: dr,
  //   weekEnd: getDayEveryDay(2021,2),
  //   monthBegin: 123456,
  //   monthEnd: 123456
  // }
  const result = {
    code: 200,
    data: data
  }
  console.log(result)
  return result

}